package beans;

import java.util.ArrayList;
import java.util.List;

import javax.naming.NamingException;

import org.richfaces.component.html.HtmlDataTable;

import co.edu.uniquindio.ondas.delegados.AdministradorDelegado;
import co.edu.uniquindio.ondas.dtos.ResumenInstitucionDTO;
import co.edu.uniquindio.ondas.entidades.Sede;

/**
 * @author Javier 
 * Bean para una sede
 */
public class SedeBean {

	private AdministradorDelegado administradorDelegado;

	private HtmlDataTable myDataTable;
	private Sede sedeSeleccionada = new Sede();

	private List<String> listaInstituciones;
	private List<String> listaZonas;
	private List<String> listaMunicipios;
	private List<String> listaNombres = new ArrayList<String>();
	private List<String> listaSedes;

	public List<Sede> sedes = new ArrayList<Sede>();

	private String nombreInstitucion = "";
	private String nombreZona = "";

	private String institucionSel = "";
	private String zonaSel = "";
	private String municipioSel = "";
	private String sedeSel = "";

	private Sede nuevaSede = new Sede();
	private boolean sedeCreada = false;
	private boolean sedeEditada = false;

	private List<ResumenInstitucionDTO> resumenSedes;
	private HtmlDataTable tablaResumenSedes;

	public static final int TAM_PAGINA = 10;

	private int paginaActual;
	private long totalPaginas;

	/**
	 * Metodo constructor
	 * 
	 * @throws NamingException
	 */
	public SedeBean() throws NamingException {
		administradorDelegado = new AdministradorDelegado();
		municipioSel = new String();
	}

	/**
	 * Metodo que obtiene la instituciones registradas en el sistema
	 * 
	 * @return
	 */
	public String listaInstituciones() {

		listaMunicipios = administradorDelegado.getListaMunicipios();
		listaInstituciones = administradorDelegado.getListaInstituciones();
		municipioSel = new String();
		return "nuevaSede";
	}

	/**
	 * Metodo que permite obtener las sedes registradas en el sistema
	 * 
	 * @return
	 */
	public String obtenerSedes() {
		sedes = new ArrayList<Sede>();
		listaNombres = administradorDelegado.getListaInstituciones();
		listaInstituciones = listaNombres;
		listaMunicipios = administradorDelegado.getListaMunicipios();
		listaZonas = administradorDelegado.getListaZonas();
		listaSedes = administradorDelegado.obtenerListaSedes();
		municipioSel = new String();
		institucionSel = new String();
		zonaSel = new String();
		municipioSel = new String();
		sedeSel = new String();
		return "editarSede";
	}

	/**
	 * Metodo que permite seleccionar in intitucion por medio un tabla en
	 * inteerfaz
	 * 
	 * @return
	 */
	public String editMyData() {

		listaInstituciones = administradorDelegado.getListaInstituciones();

		// Obtener el elemento MyData para editarlo
		sedeSeleccionada = (Sede) getMyDataTable().getRowData();
		nombreInstitucion = sedeSeleccionada.getInstitucion().getNombre();
		return "edit"; // Navega hacia edit
	}

	/**
	 * Metodo que permite obtener un Municipio
	 * 
	 * @return
	 */
	public String obtenerInMuni() {

		listaInstituciones = administradorDelegado
				.getListaNombresInstituciones(municipioSel, zonaSel);
		listaSedes = administradorDelegado.obtenerListaSedesInstitucion(
				municipioSel, institucionSel, zonaSel);

		return "";
	}

	/**
	 * Metodo que permite crear una Sede
	 * 
	 * @return
	 * @throws NamingException
	 */
	public String crearSede() throws NamingException {
		administradorDelegado = new AdministradorDelegado();

		if (!institucionSel.equals("")) {
			sedeCreada = administradorDelegado.crearSede(nuevaSede,
					institucionSel, municipioSel);
			if (sedeCreada) {
				nuevaSede = new Sede();
				institucionSel = new String();
				municipioSel = new String();
			}
		}
		return "";
	}

	/**
	 * Metodo que permite obtener las sedes de cada una de las instituciones
	 * registradas en el sistema
	 * 
	 * @return
	 */
	public String obtenerSedesInstitucion() {
		listaSedes = administradorDelegado.obtenerListaSedesInstitucion(
				municipioSel, institucionSel, zonaSel);

		return "";
	}

	/**
	 * Metodo que permite hacer una busqueda pagina de las sedes registradas en
	 * el sistema
	 * 
	 * @return
	 */
	public String buscarSedes() {
		totalPaginas = administradorDelegado.obtenerTotalPaginasSedes(
				TAM_PAGINA, municipioSel, institucionSel, sedeSel, zonaSel);

		if (totalPaginas >= 0) {
			paginaActual = 1;
			sedes = administradorDelegado.obtenerPaginaSedes(paginaActual,
					TAM_PAGINA, municipioSel, institucionSel, sedeSel, zonaSel);
		}
		return "";
	}

	/**
	 * Metodo que permite ver la pagina siguiente de la consulta paginada de de
	 * las sedes
	 * 
	 * @return
	 */
	public String paginaSiguiente() {
		if (paginaActual < totalPaginas) {
			paginaActual += 1;
			sedes = administradorDelegado.obtenerPaginaSedes(paginaActual,
					TAM_PAGINA, municipioSel, institucionSel, sedeSel, zonaSel);
		}
		return "";
	}

	/**
	 * Metodo que permite ver la pagina Anterior de la consulta paginada de las
	 * sedes
	 * 
	 * @return
	 */
	public String paginaAnterior() {
		if (paginaActual > 1) {
			paginaActual -= 1;
			sedes = administradorDelegado.obtenerPaginaSedes(paginaActual,
					TAM_PAGINA, municipioSel, institucionSel, sedeSel, zonaSel);
		}
		return "";
	}

	/**
	 * Metodo que permite editar una sede
	 * 
	 * @return
	 */
	public String editarSede() {
		sedeEditada = administradorDelegado.editarSede(sedeSeleccionada,
				institucionSel, municipioSel);
		return buscarSedes();
	}

	/**
	 * Metodo que permite obtener en resume de una sede
	 * 
	 * @return "resumenSedes"
	 */
	public String obtenerResumenSede() {
		resumenSedes = administradorDelegado.obtenerResumenSedes();
		return "resumenSedes";
	}

	/**
	 * Metodo accesor del atributo myDataTable
	 * 
	 * @return the myDataTable
	 */
	public HtmlDataTable getMyDataTable() {
		return myDataTable;
	}

	/**
	 * Metodo Modificador del atributo myDataTable
	 * 
	 * @param myDataTable
	 *            the myDataTable
	 */
	public void setMyDataTable(HtmlDataTable myDataTable) {
		this.myDataTable = myDataTable;
	}

	/**
	 * Metodo accesor del atributo sedeSeleccionada
	 * 
	 * @return the sedeSeleccionada
	 */
	public Sede getSedeSeleccionada() {
		return sedeSeleccionada;
	}

	/**
	 * Metodo Modificador del atributo sedeSeleccionada
	 * 
	 * @param sedeSeleccionada
	 *            the sedeSeleccionada
	 */
	public void setSedeSeleccionada(Sede sedeSeleccionada) {
		this.sedeSeleccionada = sedeSeleccionada;
	}

	/**
	 * Metodo accesor del atributo listaInstituciones
	 * 
	 * @return the listaInstituciones
	 */
	public List<String> getListaInstituciones() {
		return listaInstituciones;
	}

	/**
	 * Metodo Modificador del atributo listaInstituciones
	 * 
	 * @param listaInstituciones
	 *            the listaInstituciones
	 */
	public void setListaInstituciones(List<String> listaInstituciones) {
		this.listaInstituciones = listaInstituciones;
	}

	/**
	 * Metodo accesor del atributo listaZonas
	 * 
	 * @return the listaZonas
	 */
	public List<String> getListaZonas() {
		return listaZonas;
	}

	/**
	 * Metodo Modificador del atributo listaZonas
	 * 
	 * @param listaZonas
	 *            the listaZonas
	 */
	public void setListaZonas(List<String> listaZonas) {
		this.listaZonas = listaZonas;
	}

	/**
	 * Metodo accesor del atributo listaMunicipios
	 * 
	 * @return the listaMunicipios
	 */
	public List<String> getListaMunicipios() {
		return listaMunicipios;
	}

	/**
	 * Metodo Modificador del atributo listaMunicipios
	 * 
	 * @param listaMunicipios
	 *            the listaMunicipios
	 */
	public void setListaMunicipios(List<String> listaMunicipios) {
		this.listaMunicipios = listaMunicipios;
	}

	/**
	 * Metodo accesor del atributo listaNombres
	 * 
	 * @return the listaNombres
	 */
	public List<String> getListaNombres() {
		return listaNombres;
	}

	/**
	 * Metodo Modificador del atributo listaNombres
	 * 
	 * @param listaNombres
	 *            the listaNombres
	 */
	public void setListaNombres(List<String> listaNombres) {
		this.listaNombres = listaNombres;
	}

	/**
	 * Metodo accesor del atributo listaSedes
	 * 
	 * @return the listaSedes
	 */
	public List<String> getListaSedes() {
		return listaSedes;
	}

	/**
	 * Metodo Modificador del atributo listaSedes
	 * 
	 * @param listaSedes
	 *            the listaSedes
	 */
	public void setListaSedes(List<String> listaSedes) {
		this.listaSedes = listaSedes;
	}

	/**
	 * Metodo accesor del atributo sedes
	 * 
	 * @return the sedes
	 */
	public List<Sede> getSedes() {
		return sedes;
	}

	/**
	 * Metodo Modificador del atributo sedes
	 * 
	 * @param sedes
	 *            the sedes
	 */
	public void setSedes(List<Sede> sedes) {
		this.sedes = sedes;
	}

	/**
	 * Metodo accesor del atributo nombreInstitucion
	 * 
	 * @return the nombreInstitucion
	 */
	public String getNombreInstitucion() {
		return nombreInstitucion;
	}

	/**
	 * Metodo Modificador del atributo nombreInstitucion
	 * 
	 * @param nombreInstitucion
	 *            the nombreInstitucion
	 */
	public void setNombreInstitucion(String nombreInstitucion) {
		this.nombreInstitucion = nombreInstitucion;
	}

	/**
	 * Metodo accesor del atributo nombreZona
	 * 
	 * @return the nombreZona
	 */
	public String getNombreZona() {
		return nombreZona;
	}

	/**
	 * Metodo Modificador del atributo nombreZona
	 * 
	 * @param nombreZona
	 *            the nombreZona
	 */
	public void setNombreZona(String nombreZona) {
		this.nombreZona = nombreZona;
	}

	/**
	 * Metodo accesor del atributo institucionSel
	 * 
	 * @return the institucionSel
	 */
	public String getInstitucionSel() {
		return institucionSel;
	}

	/**
	 * Metodo Modificador del atributo institucionSel
	 * 
	 * @param institucionSel
	 *            the institucionSel
	 */
	public void setInstitucionSel(String institucionSel) {
		this.institucionSel = institucionSel;
	}

	/**
	 * Metodo accesor del atributo zonaSel
	 * 
	 * @return the zonaSel
	 */
	public String getZonaSel() {
		return zonaSel;
	}

	/**
	 * Metodo Modificador del atributo zonaSel
	 * 
	 * @param zonaSel
	 *            the zonaSel
	 */
	public void setZonaSel(String zonaSel) {
		this.zonaSel = zonaSel;
	}

	/**
	 * Metodo accesor del atributo municipioSel
	 * 
	 * @return the municipioSel
	 */
	public String getMunicipioSel() {
		return municipioSel;
	}

	/**
	 * Metodo Modificador del atributo municipioSel
	 * 
	 * @param municipioSel
	 *            the municipioSel
	 */
	public void setMunicipioSel(String municipioSel) {
		this.municipioSel = municipioSel;
	}

	/**
	 * Metodo accesor del atributo sedeSel
	 * 
	 * @return the sedeSel
	 */
	public String getSedeSel() {
		return sedeSel;
	}

	/**
	 * Metodo Modificador del atributo sedeSel
	 * 
	 * @param sedeSel
	 *            the sedeSel
	 */
	public void setSedeSel(String sedeSel) {
		this.sedeSel = sedeSel;
	}

	/**
	 * Metodo accesor del atributo nuevaSede
	 * 
	 * @return the nuevaSede
	 */
	public Sede getNuevaSede() {
		return nuevaSede;
	}

	/**
	 * Metodo Modificador del atributo nuevaSede
	 * 
	 * @param nuevaSede
	 *            the nuevaSede
	 */
	public void setNuevaSede(Sede nuevaSede) {
		this.nuevaSede = nuevaSede;
	}

	/**
	 * Metodo accesor del atributo sedeCreada
	 * 
	 * @return the sedeCreada
	 */
	public boolean isSedeCreada() {
		return sedeCreada;
	}

	/**
	 * Metodo Modificador del atributo sedeCreada
	 * 
	 * @param sedeCreada
	 *            the sedeCreada
	 */
	public void setSedeCreada(boolean sedeCreada) {
		this.sedeCreada = sedeCreada;
	}

	/**
	 * Metodo accesor del atributo sedeEditada
	 * 
	 * @return the sedeEditada
	 */
	public boolean isSedeEditada() {
		return sedeEditada;
	}

	/**
	 * Metodo Modificador del atributo sedeEditada
	 * 
	 * @param sedeEditada
	 *            the sedeEditada
	 */
	public void setSedeEditada(boolean sedeEditada) {
		this.sedeEditada = sedeEditada;
	}

	/**
	 * Metodo accesor del atributo resumenSedes
	 * 
	 * @return the resumenSedes
	 */
	public List<ResumenInstitucionDTO> getResumenSedes() {
		return resumenSedes;
	}

	/**
	 * Metodo Modificador del atributo resumenSedes
	 * 
	 * @param resumenSedes
	 *            the resumenSedes
	 */
	public void setResumenSedes(List<ResumenInstitucionDTO> resumenSedes) {
		this.resumenSedes = resumenSedes;
	}

	/**
	 * Metodo accesor del atributo tablaResumenSedes
	 * 
	 * @return the tablaResumenSedes
	 */
	public HtmlDataTable getTablaResumenSedes() {
		return tablaResumenSedes;
	}

	/**
	 * Metodo Modificador del atributo tablaResumenSedes
	 * 
	 * @param tablaResumenSedes
	 *            the tablaResumenSedes
	 */
	public void setTablaResumenSedes(HtmlDataTable tablaResumenSedes) {
		this.tablaResumenSedes = tablaResumenSedes;
	}

	/**
	 * Metodo accesor del atributo paginaActual
	 * 
	 * @return the paginaActual
	 */
	public int getPaginaActual() {
		return paginaActual;
	}

	/**
	 * Metodo Modificador del atributo paginaActual
	 * 
	 * @param paginaActual
	 *            the paginaActual
	 */
	public void setPaginaActual(int paginaActual) {
		this.paginaActual = paginaActual;
	}

	/**
	 * Metodo accesor del atributo totalPaginas
	 * 
	 * @return the totalPaginas
	 */
	public long getTotalPaginas() {
		return totalPaginas;
	}

	/**
	 * Metodo Modificador del atributo totalPaginas
	 * 
	 * @param totalPaginas
	 *            the totalPaginas
	 */
	public void setTotalPaginas(long totalPaginas) {
		this.totalPaginas = totalPaginas;
	}

}
